
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ОписаниеПеременных

Перем Типы;
Перем Токены;
Перем Исходник;
Перем ТаблицаТокенов;
Перем ТаблицаОшибок;
Перем ТаблицаЗамен;
Перем Стек;
Перем Счетчики;
Перем Директивы;
Перем Аннотации;
Перем СимволыПрепроцессора;

Перем СтруктураМодуля;

#КонецОбласти

#Область ПрограммныйИнтерфейс

Процедура Открыть(Парсер, Параметры) Экспорт
	
	Типы = Парсер.Типы();
	Токены = Парсер.Токены();
	Исходник = Парсер.Исходник();
	ТаблицаТокенов = Парсер.ТаблицаТокенов();
	ТаблицаОшибок = Парсер.ТаблицаОшибок();
	ТаблицаЗамен = Парсер.ТаблицаЗамен();
	Стек = Парсер.Стек();
	Счетчики = Парсер.Счетчики();
	Директивы = Парсер.Директивы();
	Аннотации = Парсер.Аннотации();
	СимволыПрепроцессора = Парсер.СимволыПрепроцессора();
	
	СтруктураМодуля = Новый Структура;
	СтруктураМодуля.Вставить("Переменные", Новый Массив);
	СтруктураМодуля.Вставить("Методы", Новый Массив);
	СтруктураМодуля.Вставить("ЕстьБлокИнициализации", Ложь);
	
КонецПроцедуры

Функция Закрыть() Экспорт
	// ...
	Возврат СтруктураМодуля;
КонецФункции

Функция Подписки() Экспорт
	Перем Подписки;
	Подписки = Новый Массив;
//	Подписки.Добавить("ПосетитьОбъявлениеПеременнойМодуля");
	Подписки.Добавить("ПосетитьОбъявлениеМетода");
	Подписки.Добавить("ПосетитьМодуль");
	Возврат Подписки;
КонецФункции

#Область РеализацияПодписок

Процедура ПосетитьОбъявлениеПеременнойМодуля(Объявление) Экспорт
	СтруктураМодуля.Переменные.Добавить(Объявление.Имя);	
КонецПроцедуры // ПосетитьОператорПрисваивания()

Процедура ПосетитьОбъявлениеМетода(Объявление) Экспорт
	СтруктураМодуля.Методы.Добавить(Объявление.Сигнатура.Имя);	
КонецПроцедуры // ПосетитьОператорПрисваивания()

Процедура ПосетитьМодуль(Объявление) Экспорт
	//Ошибка("Ошибка в операторе присваивания", ОператорПрисваивания.Начало, ОператорПрисваивания.Конец);
	СтруктураМодуля.ЕстьБлокИнициализации = Объявление.Операторы.Количество() > 0;
	
	Для Каждого ТекПеременная ИЗ Объявление.Переменные Цикл
		СтруктураМодуля.Переменные.Добавить(ТекПеременная.Имя);	
	КонецЦикла;

КонецПроцедуры // ПосетитьОператорПрисваивания()

//Процедура ПокинутьОператорПрисваивания(ОператорПрисваивания) Экспорт
//
//КонецПроцедуры // ПокинутьОператорПрисваивания()

#КонецОбласти

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

Процедура Ошибка(Текст, Начало, Конец = Неопределено, ЕстьЗамена = Ложь)
	Ошибка = ТаблицаОшибок.Добавить();
	Ошибка.Источник = "ИмяЭтогоПлагина";
	Ошибка.Текст = Текст;
	Ошибка.ПозицияНачала = Начало.Позиция;
	Ошибка.НомерСтрокиНачала = Начало.НомерСтроки;
	Ошибка.НомерКолонкиНачала = Начало.НомерКолонки;
	Если Конец = Неопределено Или Конец = Начало Тогда
		Ошибка.ПозицияКонца = Начало.Позиция + Начало.Длина;
		Ошибка.НомерСтрокиКонца = Начало.НомерСтроки;
		Ошибка.НомерКолонкиКонца = Начало.НомерКолонки + Начало.Длина;
	Иначе
		Ошибка.ПозицияКонца = Конец.Позиция + Конец.Длина;
		Ошибка.НомерСтрокиКонца = Конец.НомерСтроки;
		Ошибка.НомерКолонкиКонца = Конец.НомерКолонки + Конец.Длина;
	КонецЕсли;
	Ошибка.ЕстьЗамена = ЕстьЗамена;
КонецПроцедуры

Процедура Замена(Текст, Начало, Конец = Неопределено)
	НоваяЗамена = ТаблицаЗамен.Добавить();
	НоваяЗамена.Источник = "ИмяЭтогоПлагина";
	НоваяЗамена.Текст = Текст;
	НоваяЗамена.Позиция = Начало.Позиция;
	Если Конец = Неопределено Тогда
		НоваяЗамена.Длина = Начало.Длина;
	Иначе
		НоваяЗамена.Длина = Конец.Позиция + Конец.Длина - Начало.Позиция;
	КонецЕсли;
КонецПроцедуры

Процедура Вставка(Текст, Позиция)
	НоваяЗамена = ТаблицаЗамен.Добавить();
	НоваяЗамена.Источник = "ИмяЭтогоПлагина";
	НоваяЗамена.Текст = Текст;
	НоваяЗамена.Позиция = Позиция;
	НоваяЗамена.Длина = 0;
КонецПроцедуры
#КонецОбласти


#КонецЕсли








